package com.yungu.swift.lbs.trace.google;

import com.yungu.swift.lbs.model.dto.LatLngDto;

import java.util.List;

/**
 * Description
 *
 * @author Zerrion
 * @date 2018/1/19
 */
public class GooglePolylineUtils {
    /**
     * 加密过长的参数
     *
     * @param str 需要加密的字符串
     * @return String
     * @author Zerrion
     * @date 2018/1/9
     */
    public static String encode(String str) {
        return str;
    }

    /**
     * @param path 经纬度集合
     * @return 加密字符串
     */
    public static String encodePoly(final List<LatLngDto> path) {
        long lastLat = 0;
        long lastLng = 0;

        final StringBuffer result = new StringBuffer();

        for (final LatLngDto point : path) {
            long lat = Math.round(point.getLatitude() * 1E5);
            long lng = Math.round(point.getLongitude() * 1E5);

            long dLat = lat - lastLat;
            long dLng = lng - lastLng;

            encode(dLat, result);
            encode(dLng, result);

            lastLat = lat;
            lastLng = lng;
        }
        return result.toString();
    }

    private static void encode(long v, StringBuffer result) {
        v = v < 0 ? ~(v << 1) : v << 1;
        while (v >= 0x20) {
            result.append(Character.toChars((int) ((0x20 | (v & 0x1f)) + 63)));
            v >>= 5;
        }
        result.append(Character.toChars((int) (v + 63)));
    }
}
